package thread;
class MyRunnable implements Runnable {
    @Override
    public void run() {
        while(true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class MyThread extends Thread {
    public void run() {
        while(true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Test {
    /**
     * 多线程
     *      1.认识多线程
     *      2. 多线程代码
     */
    /**
     * 多线程代码
     *      1.继承Tread
     *      2.实现Runnable
     *      3.匿名内部类实现
     */
    /**
     * 3.匿名内部类实现
     */
    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                while(true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        t.start();

        while(true) {
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 通过实现Runnable进行实现多线程,通过runnable记录需要执行的任务
     * @param args
     *      优点:解耦合
     */
    public static void main5(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();

        while(true) {
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 自我记录任务
     * @param args
     *      继承Thread,自己记录需要执行的任务
     */
    public static void main4(String[] args) {//主线程
        Thread t = new MyThread();//创建线程实例
        t.start();//启动线程


        while(true) {
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 认识线程
     * @param args
     *      1.线程的概念
     *      2.为什么要有线程
     *      3.线程和进程的区别
     */
    public static void main3(String[] args) {
        /**
         * 3.线程和进程的区别
         * @param args
         *      1.进程包括线程,每个进程至少有一个线程存在(即主线程)
         *      2.进程与进程之间不存在共享空间,同一个进程的线程共享内存空间
         *      3.进程是系统资源的最小单位,现成是系统调度的最小单位
         *      4.进程崩溃不会影响其他进程,但是线程崩溃会影响其他进程
         */
    }

    public static void main2(String[] args) {
        /**
         * 2.为什么要有线程?
         *      1.销毁资源线程比进程快
         *      2.创建资源线程比进程快
         *      3.调度资源线程比进程快
         *      核心原因->不用进行销毁和释放资源
         */
    }
    public static void main1(String[] args) {
        /**
         * 1.线程的概念
         *      进程的一部分(一个PCB描述一个线程 多个PCB则描述一个进程)
         */
    }
}
